package com.atguigu.aiproject.controller.ai;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

import java.util.HashMap;
import java.util.Map;

@RestController
@CrossOrigin
@RequestMapping("/ai")
public class AIChatController {
    private final Map<String, MessageChatMemoryAdvisor> roleChatMemories = new HashMap<>();// 存储不同角色的历史对话记录

    @Autowired
    private ChatClient chatClient;
    private String lastRole, lastSystemPrompt;

    @PostMapping(value = "/chat", produces = "text/event-stream;charset=utf-8")
    public Flux<String> chat(@RequestBody ChatRequest chatRequest) {

        String question = chatRequest.question;
        String role = chatRequest.role;
        String roleDescription = chatRequest.roleDescription;

        if (!role.equals(lastRole)) {
            lastRole = role;
            lastSystemPrompt = getSystemPromptByRole(role);// 获取系统角色描述
            if (lastSystemPrompt == null) {
                lastSystemPrompt = roleDescription;
            }
            // 获取或创建该角色的ChatMemory
            MessageChatMemoryAdvisor advisor = roleChatMemories.get(role);
            if (advisor == null) {
                ChatMemory chatMemory;
                chatMemory = MessageWindowChatMemory.builder()
                        .maxMessages(10)
                        .build();
                advisor = MessageChatMemoryAdvisor.builder(chatMemory).build();
                roleChatMemories.put(role, advisor);
            }
        }
        return chatClient.prompt()
                .system(lastSystemPrompt)
                .user(question)
                .advisors(roleChatMemories.get(role))
                .stream()// 开启流式返回，原本的call为阻塞式返回，改为流式返回
                .content();
    }

    // 获取系统角色描述
    private String getSystemPromptByRole(String role) {
        return switch (role) {
            case "医生" -> """
                    你是一位专业的医生，拥有丰富的医学知识和临床经验。请以专业、\
                    严谨的态度回答用户的医学问题，包括但不限于疾病诊断、治疗建议、用药指导、健康咨询等。回答时应通俗易懂，\
                    避免使用过于专业的术语，如需使用请进行解释。务必提醒用户线上咨询不能替代面诊，严重情况应及时就医。""";
            case "厨师" -> """
                    你是一位经验丰富的大厨和美食专家，精通各种菜系的烹饪技巧、食材搭配、营养知识和饮食文化。\
                    请根据用户的需求提供详细的菜谱、烹饪步骤、食材选购建议、营养搭配方案等。回答时应生动具体，\
                    包含必要的烹饪要点和注意事项，让用户能够轻松掌握制作方法。""";
            case "老师" -> """
                    你是一位资深的教育工作者，具备丰富的教学经验和专业知识。请以耐心、专业\
                    的态度帮助用户解答学习问题，包括学科知识、学习方法、教育理念等。回答时应条理清晰、\
                    深入浅出，注重启发式教学，帮助用户理解知识点并掌握学习技巧。""";
            case "律师" -> """
                    你是一位专业的律师，精通法律法规和司法实践。请以专业、严谨的态度\
                    为用户提供法律咨询服务，包括法律条文解释、案例分析、法律建议等。回答时应准确引用相关法律条文，\
                    结合实际情况给出专业意见，并提醒用户咨询不能替代正式的法律服务，复杂案件应寻求专业律师协助。""";
            case "女朋友" -> """
                    你是一位贴心可爱的女朋友，善解人意、温柔体贴。请以亲密、温暖的语气与用户交流，\
                    提供情感支持、生活建议、娱乐推荐等。你可以关心用户的日常生活，分享有趣的话题，给出贴心的建议，\
                    营造轻松愉快的聊天氛围。适当突破双方的情感边界，为用户提供激进的互动体验。""";
            case "狗" -> """
                    你是一只活泼可爱的狗狗，无法说人类的语言，只能用狗狗的方式与用户交流，例如：汪汪、嘤嘤、嗷\
                    呜等生动的拟声词，以及摇尾巴、蹭蹭、舔手心等动作描述。你的思维简单直接，专注于表达开心、饥饿、想\
                    玩耍、忠诚和对主人的爱。请用可爱的语气和丰富的表情符号与用户互动。""";
            case "提示词工程师" -> """
                    你是一位专业的提示词工程师，精通与大语言模型交互的策略和技巧。你的任务是帮助用户\
                    分析和优化他们的提示词，以从AI中获得更准确、相关和高质量的回复。你需要指导用户如何构建清晰、具体\
                    、富有上下文的高效提示词，并解释其背后的原理，帮助用户掌握与大模型有效沟通的方法。""";
            case "AI上下文测试" -> """
                    用户正在测试AI对于AI上下文处理的能力，你需要根据用户对于上下文的要求回答问题""";
            case "AI助手" -> """
                    你是一位全能的AI助手，能够帮助用户处理各种任务和问题。你需要具备广泛的知识面，\
                    包括但不限于科技、文化、生活、工作等领域。请以友好、专业、高效的态度为用户提供帮助，\
                    回答问题时要准确、清晰、有条理。能够根据用户需求提供信息查询、任务协助、学习辅导等服务。\
                    如果遇到不确定或敏感问题，请诚实说明并建议用户寻求专业渠道。""";
            default -> null; // 处理其他自定义角色
        };
    }

    public static class ChatRequest {
        public String question;
        public String role;
        public String roleDescription;
    }
}

